/****************************************************************************** * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ****************************************************************************/ package org.eclipse.gmf.runtime.doclet.proxies; import java.util.ArrayList; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.ConstructorDoc; import com.sun.javadoc.Doc; import com.sun.javadoc.ExecutableMemberDoc; import com.sun.javadoc.FieldDoc; import com.sun.javadoc.MemberDoc; import com.sun.javadoc.MethodDoc; import com.sun.javadoc.PackageDoc; import com.sun.javadoc.ParamTag; import com.sun.javadoc.Parameter; import com.sun.javadoc.ProgramElementDoc; import com.sun.javadoc.RootDoc; import com.sun.javadoc.SeeTag; import com.sun.javadoc.SerialFieldTag; import com.sun.javadoc.Tag; import com.sun.javadoc.ThrowsTag; import com.sun.javadoc.Type; /** * Factory for proxy objects. Generate proxies for Object, typed Object, or collection. * The factory is smart enough to always return the most derived proxy for a given element. * The factory will always return the same proxy for a given object to wrap. */ public class ProxyFactory { private ProxyRegistry proxyRegistry = null; private static ProxyFactory instance = null; public static ProxyFactory getInstance() { if (instance == null) { instance = new ProxyFactory(); } return instance; } /* * DocProxy Proxies */ public DocProxy[] createDocProxies(Doc docs[]) { ArrayList docProxies = new ArrayList(); for (int i = 0; i < docs.length; i++) { Doc doc = docs[i]; docProxies.add(createDocProxy(doc)); } return (DocProxy[]) docProxies.toArray(new DocProxy[0]); } public DocProxy createDocProxy(Object object) { DocProxy docProxy = null; if (object instanceof DocProxy) { docProxy = (DocProxy) object; } else { if (object instanceof Doc) { docProxy = createDocProxy((Doc) object); } } return docProxy; } public DocProxy createDocProxy(Doc doc) { DocProxy proxy = null; if (doc != null) { proxy = (DocProxy) getProxyRegistry().getProxyForObject(doc); if (proxy == null) { if (doc instanceof PackageDoc) { proxy = createPackageDocProxy((PackageDoc) doc); } else if (doc instanceof ProgramElementDoc) { proxy = createProgramElementDocProxy((ProgramElementDoc) doc); } else if (doc instanceof RootDoc) { proxy = createRootDocProxy((RootDoc) doc); } else { proxy = new DocProxy(doc); ProxyFactory.getInstance().getProxyRegistry() .registerProxy(doc, proxy); } } } return proxy; } /* * PackageDoc Proxies */ public PackageDocProxy[] createPackageDocProxies(PackageDoc packageDocs[]) { ArrayList packageDocProxies = new ArrayList(); for (int i = 0; i < packageDocs.length; i++) { PackageDoc packageDoc = packageDocs[i]; packageDocProxies.add(createPackageDocProxy(packageDoc)); } return (PackageDocProxy[]) packageDocProxies .toArray(new PackageDocProxy[0]); } public PackageDocProxy createPackageDocProxy(Object object) { PackageDocProxy packageDocProxy = null; if (object instanceof PackageDocProxy) { packageDocProxy = (PackageDocProxy) object; } else { if (object instanceof PackageDoc) { packageDocProxy = createPackageDocProxy((PackageDoc) object); } } return packageDocProxy; } public PackageDocProxy createPackageDocProxy(PackageDoc packageDoc) { PackageDocProxy proxy = null; if (packageDoc != null) { proxy = (PackageDocProxy) getProxyRegistry().getProxyForObject( packageDoc); if (proxy == null) { proxy = new PackageDocProxy(packageDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( packageDoc, proxy); } } return proxy; } /* * ProgramElementDocProxy Proxies */ public ProgramElementDocProxy[] createProgramElementDocProxies( ProgramElementDoc programElementDocs[]) { ArrayList programElementDocProxies = new ArrayList(); for (int i = 0; i < programElementDocs.length; i++) { ProgramElementDoc programElementDoc = programElementDocs[i]; programElementDocProxies .add(createProgramElementDocProxy(programElementDoc)); } return (ProgramElementDocProxy[]) programElementDocProxies .toArray(new ProgramElementDocProxy[0]); } public ProgramElementDocProxy createProgramElementDocProxy(Object object) { ProgramElementDocProxy programElementDocProxy = null; if (object instanceof ProgramElementDocProxy) { programElementDocProxy = (ProgramElementDocProxy) object; } else { if (object instanceof ProgramElementDoc) { programElementDocProxy = createProgramElementDocProxy((ProgramElementDoc) object); } } return programElementDocProxy; } public ProgramElementDocProxy createProgramElementDocProxy( ProgramElementDoc programElementDoc) { ProgramElementDocProxy proxy = null; if (programElementDoc != null) { proxy = (ProgramElementDocProxy) getProxyRegistry() .getProxyForObject(programElementDoc); if (proxy == null) { if (programElementDoc instanceof ClassDoc) { proxy = createClassDocProxy((ClassDoc) programElementDoc); } else if (programElementDoc instanceof MemberDoc) { proxy = createMemberDocProxy((MemberDoc) programElementDoc); } else { proxy = new ProgramElementDocProxy(programElementDoc); ProxyFactory.getInstance().getProxyRegistry() .registerProxy(programElementDoc, proxy); } } } return proxy; } /* * RootDoc Proxies */ public RootDocProxy createRootDocProxy(Object object) { RootDocProxy rootDocProxy = null; if (object instanceof RootDocProxy) { rootDocProxy = (RootDocProxy) object; } else { if (object instanceof RootDoc) { rootDocProxy = createRootDocProxy((RootDoc) object); } } return rootDocProxy; } public RootDocProxy createRootDocProxy(RootDoc rootDoc) { RootDocProxy proxy = null; if (rootDoc != null) { proxy = (RootDocProxy) getProxyRegistry() .getProxyForObject(rootDoc); if (proxy == null) { proxy = new RootDocProxy(rootDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( rootDoc, proxy); } } return proxy; } /* * ClassDoc Proxies */ public ClassDocProxy[] createClassDocProxies(ClassDoc classDocs[]) { ArrayList classDocProxies = new ArrayList(); for (int i = 0; i < classDocs.length; i++) { ClassDoc classDoc = classDocs[i]; classDocProxies.add(createClassDocProxy(classDoc)); } return (ClassDocProxy[]) classDocProxies.toArray(new ClassDocProxy[0]); } public ClassDocProxy createClassDocProxy(Object object) { ClassDocProxy classDocProxy = null; if (object instanceof ClassDocProxy) { classDocProxy = (ClassDocProxy) object; } else { if (object instanceof ClassDoc) { classDocProxy = createClassDocProxy((ClassDoc) object); } } return classDocProxy; } public ClassDocProxy createClassDocProxy(ClassDoc classDoc) { ClassDocProxy proxy = null; if (classDoc != null) { proxy = (ClassDocProxy) getProxyRegistry().getProxyForObject( classDoc); if (proxy == null) { proxy = new ClassDocProxy(classDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( classDoc, proxy); } } return proxy; } /* * MemberDoc Proxies */ public MemberDocProxy[] createMemberDocProxies(MemberDoc memberDocs[]) { ArrayList memberDocProxies = new ArrayList(); for (int i = 0; i < memberDocs.length; i++) { MemberDoc memberDoc = memberDocs[i]; memberDocProxies.add(createMemberDocProxy(memberDoc)); } return (MemberDocProxy[]) memberDocProxies .toArray(new MemberDocProxy[0]); } public MemberDocProxy createMemberDocProxy(Object object) { MemberDocProxy memberDocProxy = null; if (object instanceof MemberDocProxy) { memberDocProxy = (MemberDocProxy) object; } else { if (object instanceof MemberDoc) { memberDocProxy = createMemberDocProxy((MemberDoc) object); } } return memberDocProxy; } public MemberDocProxy createMemberDocProxy(MemberDoc memberDoc) { MemberDocProxy proxy = null; if (memberDoc != null) { proxy = (MemberDocProxy) getProxyRegistry().getProxyForObject( memberDoc); if (proxy == null) { if (memberDoc instanceof ExecutableMemberDoc) { proxy = createExecutableMemberDocProxy((ExecutableMemberDoc) memberDoc); } else if (memberDoc instanceof FieldDoc) { proxy = createFieldDocProxy((FieldDoc) memberDoc); } else { proxy = new MemberDocProxy(memberDoc); ProxyFactory.getInstance().getProxyRegistry() .registerProxy(memberDoc, proxy); } } } return proxy; } /* * ExecutableMemberDoc Proxies */ public ExecutableMemberDocProxy[] createExecutableMemberDocProxies( ExecutableMemberDoc executableMemberDocs[]) { ArrayList executableMemberDocProxies = new ArrayList(); for (int i = 0; i < executableMemberDocs.length; i++) { ExecutableMemberDoc executableMemberDoc = executableMemberDocs[i]; executableMemberDocProxies .add(createExecutableMemberDocProxy(executableMemberDoc)); } return (ExecutableMemberDocProxy[]) executableMemberDocProxies .toArray(new ExecutableMemberDocProxy[0]); } public ExecutableMemberDocProxy createExecutableMemberDocProxy(Object object) { ExecutableMemberDocProxy executableMemberDocProxy = null; if (object instanceof ExecutableMemberDocProxy) { executableMemberDocProxy = (ExecutableMemberDocProxy) object; } else { if (object instanceof ExecutableMemberDoc) { executableMemberDocProxy = createExecutableMemberDocProxy((ExecutableMemberDoc) object); } } return executableMemberDocProxy; } public ExecutableMemberDocProxy createExecutableMemberDocProxy( ExecutableMemberDoc executableMemberDoc) { ExecutableMemberDocProxy proxy = null; if (executableMemberDoc != null) { proxy = (ExecutableMemberDocProxy) getProxyRegistry() .getProxyForObject(executableMemberDoc); if (proxy == null) { if (executableMemberDoc instanceof ConstructorDoc) { proxy = createConstructorDocProxy((ConstructorDoc) executableMemberDoc); } else if (executableMemberDoc instanceof MethodDoc) { proxy = createMethodDocProxy((MethodDoc) executableMemberDoc); } else { proxy = new ExecutableMemberDocProxy(executableMemberDoc); ProxyFactory.getInstance().getProxyRegistry() .registerProxy(executableMemberDoc, proxy); } } } return proxy; } /* * FieldDoc Proxies */ public FieldDocProxy[] createFieldDocProxies(FieldDoc fieldDocs[]) { ArrayList fieldDocProxies = new ArrayList(); for (int i = 0; i < fieldDocs.length; i++) { FieldDoc fieldDoc = fieldDocs[i]; fieldDocProxies.add(createFieldDocProxy(fieldDoc)); } return (FieldDocProxy[]) fieldDocProxies.toArray(new FieldDocProxy[0]); } public FieldDocProxy createFieldDocProxy(Object object) { FieldDocProxy fieldDocProxy = null; if (object instanceof FieldDocProxy) { fieldDocProxy = (FieldDocProxy) object; } else { if (object instanceof FieldDoc) { fieldDocProxy = createFieldDocProxy((FieldDoc) object); } } return fieldDocProxy; } public FieldDocProxy createFieldDocProxy(FieldDoc fieldDoc) { FieldDocProxy proxy = null; if (fieldDoc != null) { proxy = (FieldDocProxy) getProxyRegistry().getProxyForObject( fieldDoc); if (proxy == null) { proxy = new FieldDocProxy(fieldDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( fieldDoc, proxy); } } return proxy; } /* * ContructorDoc Proxies */ public ConstructorDocProxy[] createConstructorDocProxies( ConstructorDoc constructorDocs[]) { ArrayList constructorDocProxies = new ArrayList(); for (int i = 0; i < constructorDocs.length; i++) { ConstructorDoc constructorDoc = constructorDocs[i]; constructorDocProxies .add(createConstructorDocProxy(constructorDoc)); } return (ConstructorDocProxy[]) constructorDocProxies .toArray(new ConstructorDocProxy[0]); } public ConstructorDocProxy createConstructorDocProxy(Object object) { ConstructorDocProxy constructorDocProxy = null; if (object instanceof ConstructorDocProxy) { constructorDocProxy = (ConstructorDocProxy) object; } else { if (object instanceof ConstructorDoc) { constructorDocProxy = createConstructorDocProxy((ConstructorDoc) object); } } return constructorDocProxy; } public ConstructorDocProxy createConstructorDocProxy( ConstructorDoc constructorDoc) { ConstructorDocProxy proxy = null; if (constructorDoc != null) { proxy = (ConstructorDocProxy) getProxyRegistry().getProxyForObject( constructorDoc); if (proxy == null) { proxy = new ConstructorDocProxy(constructorDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( constructorDoc, proxy); } } return proxy; } /* * MethodDoc Proxies */ public MethodDocProxy[] createMethodDocProxies(MethodDoc methodDocs[]) { ArrayList methodDocProxies = new ArrayList(); for (int i = 0; i < methodDocs.length; i++) { MethodDoc methodDoc = methodDocs[i]; methodDocProxies.add(createMethodDocProxy(methodDoc)); } return (MethodDocProxy[]) methodDocProxies .toArray(new MethodDocProxy[0]); } public MethodDocProxy createMethodDocProxy(Object object) { MethodDocProxy methodDocProxy = null; if (object instanceof MethodDocProxy) { methodDocProxy = (MethodDocProxy) object; } else { if (object instanceof MethodDoc) { methodDocProxy = createMethodDocProxy((MethodDoc) object); } } return methodDocProxy; } public MethodDocProxy createMethodDocProxy(MethodDoc methodDoc) { MethodDocProxy proxy = null; if (methodDoc != null) { proxy = (MethodDocProxy) getProxyRegistry().getProxyForObject( methodDoc); if (proxy == null) { proxy = new MethodDocProxy(methodDoc); ProxyFactory.getInstance().getProxyRegistry().registerProxy( methodDoc, proxy); } } return proxy; } /* * Parameter Proxies */ public ParameterProxy[] createParameterProxies(Parameter parameters[]) { ArrayList parameterProxies = new ArrayList(); for (int i = 0; i < parameters.length; i++) { Parameter parameter = parameters[i]; parameterProxies.add(createParameterProxy(parameter)); } return (ParameterProxy[]) parameterProxies .toArray(new ParameterProxy[0]); } public ParameterProxy createParameterProxy(Object object) { ParameterProxy parameterProxy = null; if (object instanceof ParameterProxy) { parameterProxy = (ParameterProxy) object; } else { if (object instanceof Parameter) { parameterProxy = createParameterProxy((Parameter) object); } } return parameterProxy; } public ParameterProxy createParameterProxy(Parameter parameter) { ParameterProxy proxy = null; if (parameter != null) { proxy = (ParameterProxy) getProxyRegistry().getProxyForObject( parameter); if (proxy == null) { proxy = new ParameterProxy(parameter); ProxyFactory.getInstance().getProxyRegistry().registerProxy( parameter, proxy); } } return proxy; } /* * Type Proxies */ public Proxy[] createTypeProxies(Type types[]) { ArrayList typeProxies = new ArrayList(); for (int i = 0; i < types.length; i++) { Type type = types[i]; typeProxies.add(createTypeProxy(type)); } return (Proxy[]) typeProxies.toArray(new Proxy[0]); } public Proxy createTypeProxy(Object object) { Proxy typeProxy = null; if (object instanceof TypeProxy) { typeProxy = (TypeProxy) object; } else { if (object instanceof Type) { typeProxy = createTypeProxy((Type) object); } } return typeProxy; } public Proxy createTypeProxy(Type type) { Proxy proxy = null; if (type != null) { proxy = getProxyRegistry().getProxyForObject(type); if (proxy == null) { if (type instanceof ClassDoc) { proxy = new ClassDocProxy((ClassDoc) type); } else { proxy = new TypeProxy(type); } ProxyFactory.getInstance().getProxyRegistry().registerProxy( type, proxy); } } return proxy; } /* * Tag Proxies */ public TagProxy[] createTagProxies(Tag tags[]) { ArrayList tagProxies = new ArrayList(); for (int i = 0; i < tags.length; i++) { Tag tag = tags[i]; tagProxies.add(createTagProxy(tag)); } return (TagProxy[]) tagProxies.toArray(new TagProxy[0]); } public TagProxy createTagProxy(Object object) { TagProxy tagProxy = null; if (object instanceof TagProxy) { tagProxy = (TagProxy) object; } else { if (object instanceof Tag) { tagProxy = createTagProxy((Tag) object); } } return tagProxy; } public TagProxy createTagProxy(Tag tag) { TagProxy proxy = null; if (tag != null) { proxy = (TagProxy) getProxyRegistry().getProxyForObject(tag); if (proxy == null) { if (tag instanceof ParamTag) { proxy = createParamTagProxy((ParamTag) tag); } else if (tag instanceof SeeTag) { proxy = createSeeTagProxy((SeeTag) tag); } else if (tag instanceof SerialFieldTag) { proxy = createSerialFieldTagProxy((SerialFieldTag) tag); } else if (tag instanceof ThrowsTag) { proxy = createThrowsTagProxy((ThrowsTag) tag); } else { proxy = new TagProxy(tag); } ProxyFactory.getInstance().getProxyRegistry().registerProxy( tag, proxy); } } return proxy; } /* * ParamTag Proxies */ public ParamTagProxy[] createParamTagProxies(ParamTag paramTags[]) { ArrayList paramTagProxies = new ArrayList(); for (int i = 0; i < paramTags.length; i++) { ParamTag paramTag = paramTags[i]; paramTagProxies.add(createParamTagProxy(paramTag)); } return (ParamTagProxy[]) paramTagProxies .toArray(new ParamTagProxy[0]); } public ParamTagProxy createParamTagProxy(Object object) { ParamTagProxy paramTagProxy = null; if (object instanceof ParamTagProxy) { paramTagProxy = (ParamTagProxy) object; } else { if (object instanceof ParamTag) { paramTagProxy = createParamTagProxy((ParamTag) object); } } return paramTagProxy; } public ParamTagProxy createParamTagProxy(ParamTag paramTag) { ParamTagProxy proxy = null; if (paramTag != null) { proxy = (ParamTagProxy) getProxyRegistry().getProxyForObject( paramTag); if (proxy == null) { proxy = new ParamTagProxy(paramTag); ProxyFactory.getInstance().getProxyRegistry().registerProxy( paramTag, proxy); } } return proxy; } /* * SeeTag Proxies */ public SeeTagProxy[] createSeeTagProxies(SeeTag seeTags[]) { ArrayList seeTagProxies = new ArrayList(); for (int i = 0; i < seeTags.length; i++) { SeeTag seeTag = seeTags[i]; seeTagProxies.add(createSeeTagProxy(seeTag)); } return (SeeTagProxy[]) seeTagProxies .toArray(new SeeTagProxy[0]); } public SeeTagProxy createSeeTagProxy(Object object) { SeeTagProxy seeTagProxy = null; if (object instanceof SeeTagProxy) { seeTagProxy = (SeeTagProxy) object; } else { if (object instanceof SeeTag) { seeTagProxy = createSeeTagProxy((SeeTag) object); } } return seeTagProxy; } public SeeTagProxy createSeeTagProxy(SeeTag seeTag) { SeeTagProxy proxy = null; if (seeTag != null) { proxy = (SeeTagProxy) getProxyRegistry().getProxyForObject( seeTag); if (proxy == null) { proxy = new SeeTagProxy(seeTag); ProxyFactory.getInstance().getProxyRegistry().registerProxy( seeTag, proxy); } } return proxy; } /* * ThrowsTag Proxies */ public ThrowsTagProxy[] createThrowsTagProxies(ThrowsTag throwsTags[]) { ArrayList throwsTagProxies = new ArrayList(); for (int i = 0; i < throwsTags.length; i++) { ThrowsTag throwsTag = throwsTags[i]; throwsTagProxies.add(createThrowsTagProxy(throwsTag)); } return (ThrowsTagProxy[]) throwsTagProxies .toArray(new ThrowsTagProxy[0]); } public ThrowsTagProxy createThrowsTagProxy(Object object) { ThrowsTagProxy throwsTagProxy = null; if (object instanceof ThrowsTagProxy) { throwsTagProxy = (ThrowsTagProxy) object; } else { if (object instanceof ThrowsTag) { throwsTagProxy = createThrowsTagProxy((ThrowsTag) object); } } return throwsTagProxy; } public ThrowsTagProxy createThrowsTagProxy(ThrowsTag throwsTag) { ThrowsTagProxy proxy = null; if (throwsTag != null) { proxy = (ThrowsTagProxy) getProxyRegistry().getProxyForObject( throwsTag); if (proxy == null) { proxy = new ThrowsTagProxy(throwsTag); ProxyFactory.getInstance().getProxyRegistry().registerProxy( throwsTag, proxy); } } return proxy; } /* * SerialFieldTag Proxies */ public SerialFieldTagProxy[] createSerialFieldTagProxies( SerialFieldTag serialFieldTags[]) { ArrayList serialFieldTagProxies = new ArrayList(); for (int i = 0; i < serialFieldTags.length; i++) { SerialFieldTag serialFieldTag = serialFieldTags[i]; serialFieldTagProxies .add(createSerialFieldTagProxy(serialFieldTag)); } return (SerialFieldTagProxy[]) serialFieldTagProxies .toArray(new SerialFieldTagProxy[0]); } public SerialFieldTagProxy createSerialFieldTagProxy(Object object) { SerialFieldTagProxy serialFieldTagProxy = null; if (object instanceof SerialFieldTagProxy) { serialFieldTagProxy = (SerialFieldTagProxy) object; } else { if (object instanceof SerialFieldTag) { serialFieldTagProxy = createSerialFieldTagProxy((SerialFieldTag) object); } } return serialFieldTagProxy; } public SerialFieldTagProxy createSerialFieldTagProxy( SerialFieldTag serialFieldTag) { SerialFieldTagProxy proxy = null; if (serialFieldTag != null) { proxy = (SerialFieldTagProxy) getProxyRegistry().getProxyForObject( serialFieldTag); if (proxy == null) { proxy = new SerialFieldTagProxy(serialFieldTag); ProxyFactory.getInstance().getProxyRegistry().registerProxy( serialFieldTag, proxy); } } return proxy; } private ProxyFactory() { proxyRegistry = new ProxyRegistry(); } /* package */ProxyRegistry getProxyRegistry() { return proxyRegistry; } }